﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using ebcbinder;
using kinokasse.bauteile.contracts;
using kinokasse.bauteile.contracts.Belegungen;
using kinokasse.bauteile.contracts.BelegungenRepository;
using kinokasse.bauteile.contracts.ebcpatterns;
using kinokasse.bauteile.contracts.Kartendrucker;
using kinokasse.bauteile.contracts.KassenPortal;
using kinokasse.bauteile.contracts.PreisgruppenRepository;
using kinokasse.bauteile.contracts.Saalpläne;
using kinokasse.bauteile.contracts.SaalpläneRepository;
using kinokasse.bauteile.contracts.SaalplanView;
using kinokasse.belegungen;
using kinokasse.Belegungen;
using kinokasse.belegungenrepo;
using kinokasse.datamodel.contracts;
using kinokasse.kartendrucker;
using kinokasse.kassenportal;
using kinokasse.preisgruppenrepo;
using kinokasse.saalpläne;
using kinokasse.saalplänerepo;
using kinokasse.saalplanview;

namespace kinokasse.host
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            IEntryPoint hauptbaugruppe;

            var binder = new EbcBinder();
            using (binder.BeginRootGroup())
            {
                var saalnummerFilter = binder.Create<IFilter<string>,Filter<string>>();
                var sitzeLaden = binder.Create<ISitzeLaden, SitzeLaden>();
                var preisgruppenLaden = binder.Create<IPreisgruppenLaden, PreisgruppenLaden>();
                var joinSitzeUndPreisgruppen = binder.Create<IJoin<IEnumerable<Sitz>, IEnumerable<Preisgruppe>>, Join<IEnumerable<Sitz>, IEnumerable<Preisgruppe>>>();
                var sitzeBepreisen = binder.Create<ISitzeBepreisen, SitzeBepreisen>();
                var saalplanLaden = binder.Create<ISaalplanLaden>(new SaalplanLaden(binder, 
                                                                                    sitzeLaden, 
                                                                                    saalnummerFilter, 
                                                                                    preisgruppenLaden,
                                                                                    joinSitzeUndPreisgruppen, 
                                                                                    sitzeBepreisen));

                var sitzWählen = binder.Create<ISitzWählen, SitzWählen>();
                var preisBerechnen = binder.Create<IPreisBerechnen, PreisBerechnen>();
                var sitzeWählen = binder.Create<ISitzeWählen>(new SitzeWählen(binder,
                                                                              sitzWählen,
                                                                              preisBerechnen));

                var plätzeErzeugen = binder.Create<IPlätzeErzeugen, PlätzeErzeugen>();
                var buchungsRepository = binder.Create<IBuchungsRepository, BuchungsRepository>();
                var kartenDrucken = binder.Create<IKartenDrucken, KartenDrucken>();
                var saalplanViewControl = new SaalplanView();
                var saalplanView = binder.Create<ISaalplanView>(saalplanViewControl);
                var plätzeKaufen = binder.Create<IPlätzeKaufen>(new PlätzeKaufen(binder,
                                                                                 plätzeErzeugen,
                                                                                 buchungsRepository,
                                                                                 kartenDrucken,
                                                                                 saalplanView));

                var belegungenAktualisieren = binder.Create<IBelegungenAktualisieren>(new BelegungenAktualisieren(binder,
                                                                                    buchungsRepository,
                                                                                    saalplanView));

                var kassenPortal = binder.Create<IKassenPortal>(new WinMain(saalplanViewControl));

                hauptbaugruppe = new Hauptbaugruppe(binder,
                                                    kassenPortal,
                                                    saalplanView,

                                                    saalplanLaden,
                                                    sitzeWählen,
                                                    plätzeKaufen,
                                                    belegungenAktualisieren);
            }

            hauptbaugruppe.Run(args);
        }
    }
}
